邁入Day7! 今天就來些輕鬆一點的內容吧
今天我們來談談在 Day5 提到的 INSTALLED_APPS 內的寫法,其實也蠻tricky的這個議題
如果你依稀記得 Day6 的 vendor,要 Django 追蹤的方法就是將 vendor.apps.VendorConfig
,加入 INSTALLED_APP
到這裡都沒有問題!
但是小弟我剛開始在學的時候,參考的來源不只一個網站,然後發現大家寫法不同,但是卻都能夠執行!
這是什麼意思呢? 也就是說 Day6 的 INSTALLED_APP,你可以這樣寫
INSTALLED_APPS = [
'vendor',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
你可以使用更簡單的寫法 app name - 也就是將 vendor.apps.VendorConfig 替換成 vendor
阿你就會開始疑惑說 : 這麼簡單的寫法為什麼不直接告訴我就好了!!
沒有不告訴你啊,剛剛不是講了嗎 ^^"
A list of strings designating all applications that are enabled in this Django installation. Each string should be a dotted Python path to:
- an application configuration class (preferred)
- a package containing an application
所以說,其實這兩種寫法都可以,但是推薦你使用 vendor.apps.VendorConfig
這也算是 版本演化 下的一個產物
在 Django 1.9以前,下 python manage.py startapp [someapps]
是不會自動產生 apps.py 在該app資料夾底下的,而你去打開 vendor 底下的 apps.py 便可以看到
from django.apps import AppConfig
class VendorConfig(AppConfig):
name = 'vendor'
而上述的敘述要搭配著下面這一段文字看
When INSTALLED_APPS simply contains the dotted path to an application module, Django checks for a default_app_config variable in that module.
If it’s defined, it’s the dotted path to the AppConfig subclass for that application.
If there is no default_app_config, Django uses the base AppConfig class.
也就是說,我們託付給 Django 管理 apps,它的運作模式就是去看該路徑是否有 default_app_config 這個變數,如果有這個變數,才會繼續去看後面所接的路徑,很抽象對吧,直接帶你看一個例子
我們來到內部的 ithome\settings.py,來追 INSTALLED_APPS 的設定 django.contrib.admin
該檔案在虛擬環境 Django 套件下cd .(你的目錄).\ithome\ithome_enve\Lib\site-packages\django\contrib\admin
省略部分內容 ...
def autodiscover():
autodiscover_modules('admin', register_to=site)
default_app_config = 'django.contrib.admin.apps.AdminConfig'
在 __init__.py 你便可以看到這個設定,抓到 default_app_config,我們再繼續追 apps.AdminConfig
from django.apps import AppConfig
from django.contrib.admin.checks import check_admin_app, check_dependencies
from django.core import checks
from django.utils.translation import gettext_lazy as _
class SimpleAdminConfig(AppConfig):
...省略
class AdminConfig(SimpleAdminConfig):
"""The default AppConfig for admin which does autodiscovery."""
def ready(self):
super().ready()
self.module.autodiscover()
trace到這邊,相信大家就會很明瞭了 ^^
大致上就是這樣,文章上面也強調,這是時代下演化出的產物,所以在 Django 1.7 以前這些內容都已經固定了,所以這些功能就只是取決於我們要不要使用,而不用去動它們
但是現在呢
New applications should avoid default_app_config. Instead they should require the dotted path to the appropriate AppConfig subclass to be configured explicitly in INSTALLED_APPS.
我們應該避免使用單純 app 的名稱,或是在 __init__.py 建立default_app_config = vendor.apps.VendorConfig
而是採用更明確的方式,在 settings.py 的 INSTALLED_APPS 加入 [someapp].apps.[SomeApps]Config
當然, INSTALLED_APP 還有更多功能可以玩,不過今天主軸擺在 探討 INSTALLED_APPS
希望這篇內容能夠釐清也在這探討INSTALLED_APPS寫法的人^^
參考資源
釐清polls.apps.PollsConfig 及 polls (1)
釐清polls.apps.PollsConfig 及 polls (2)
stackoverflow裡有無數的巨人,而自己也朝著成為巨人的路邁進 From BY
您好,我在INSTALLED_APPS打vendor.apps.VendorConfig反而會得到這個error
has no attribute 'vendor'
但直接打vendor就過了0.0
不知道是不是架構和您不一樣的原因?看您的架構是manage.py 在\ithome\ithome下
但我的manage.py是在\ithome下
我也跟您是一樣處境,雖然不知道原因,但好像登入是沒問題的QWQ (後續再新增時多少有點問題,但還是無法釐清是否與這些有關係QWQ (好難Q.Q